import socket
import struct
from termcolor import cprint

class smb_code_execution_BaseVerify():

    def __init__(self,url):
        self.pkt = b'\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00\x02\x02\x10\x02"\x02$\x02\x00\x03\x02\x03\x10\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00'
        self.url = url

    def run(self):
        sock = socket.socket(socket.AF_INET)
        sock.settimeout(3)
        try:
            sock.connect((str(self.url), 445 ))

            sock.send(self.pkt)
            nb, = struct.unpack(">I", sock.recv(4))
            res = sock.recv(nb)
            if res[68:70] != b"\x11\x03" or res[70:72] != b"\x02\x00":
                cprint("[+]不存在SMB远程代码执行漏洞\t", "red")
            else:
                cprint("[+]存在SMB远程代码执行漏洞\t", "red")
                return True

        except:
            cprint("[-] " + __file__ + "====>可能不存在漏洞", "cyan")
            sock.close()
            pass

if __name__ == '__main__':
    smb=smb_code_execution_BaseVerify('127.0.0.1')
    smb.run()